/**
 * 公共功能模块
 */

//导入debug模块,并定义两个名字空间
const debug=require("debug")("mybook-server:[debug]");
const error=require("debug")("mybook-server:[error]");
//导入加密模块
const crypto=require("crypto");

const config=require("../common/config");


/**
 * JSONData数据类型说明
 * 
 * @typedef {Object} JSONData
 * @property {Number} code
 * @property {String} msg
 * @property {Object | Array} data
 * @returns {JSONData}
 */

/**
 * 统一格式返回的JSON数据
 * 
 * 200 - 访问成功
 * 201 - 新增资源
 * 202 - 更新资源
 * 203 - 删除资源
 * 400 - 错误请求
 * 401 - 无访问权限
 * 
 * @param {Number} code - 返回自定义的状态码
 * @param {String} msg - 提示消息
 * @param {Object | Array} data - 数据结果
 * @returns {JSONData}
 */
function FormatJSONData(code,msg="",data=[]){
    if(!data){
        data=[];
    }
    return {code:code,msg:msg,data:data};
}

/**
 * 调试信息
 * @param {String} msg - 调试信息
 */
function log(msg){
    debug(msg);
}

/**
 * 带格式调试信息
 * @param {String} formatter - 带格式的字符串例如 %O,%j
 * @param {Object} data - 数据对象
 */
function logFormat(formatter,data){
    debug(formatter,data);
}

/**
 * 错误信息
 * @param {String} msg -错误信息
 */
function err(msg){
    error(msg);
}

/**
 * 生成MD5后的密码
 * @param {String} password 密码
 * @returns {String} 16进制密码串
 */
function md5pwd(password){
    let salt=config.salt;
    let md5=crypto.createHash("md5");
    return md5.update(password+salt).digest("hex");
}

/**
 * 获取请求的IP地址
 * @param {Object} req - 请求对象
 * @returns {String} IP地址
 */
function getReqRemoteIP(req){
    let ip=req.headers["x-forwarded-for"]||
    req.connection.remoteAddress||
    req.socket.remoteAddress||
    req.connection.socket.remoteAddress;
    return ip;
}/**
 * 获取请求的IP地址
 * @param {Object} req - 请求对象
 * @returns {String} IP地址
 */
function getReqRemoteIP(req){
    let ip=req.headers["x-forwarded-for"]||
    req.connection.remoteAddress||
    req.socket.remoteAddress||
    req.connection.socket.remoteAddress;
    return ip;
}

module.exports={
    FormatJSONData,
    log,
    logFormat,
    err,
    md5pwd,
    getReqRemoteIP,
}